package com.aluvfy.jdbc;

import com.aluvfy.jdbc.utils.DbUtils;

import java.sql.*;
import java.util.Scanner;

/*
* Description:使用PreparedStatement解决SQL注入问题
* PreparedStatement原理：
*       先对sql语句进行预编译
*       再将参数值赋值给占位符
* 重点注意事项：
*       在使用预编译的数据库操作对象PreparedStatement时，要先获取sql语句，再获取PreparedStatement对象
*       这里编写的sql语句的 值 的位置采用占位符来代替，占位符为 ？ 问好两边不可以使用单引号或者双引号括起来
* */
public class JDBCTest09 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //初始化登录页面
        System.out.println("欢迎使用该系统！");
        System.out.println("用户：");
        String loginName = scanner.nextLine();
        System.out.println("密码：");
        String loginPwd = scanner.nextLine();

        //连接数据库 判断账户密码是否正确
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        boolean loginSuccess = false;
        String realName = null;

        try {
            //连接数据库
            conn = DbUtils.getConnection();
            //获取数据库对象
            String sql = "select * from t_user where name = ? and password = ?";
            ps = conn.prepareStatement(sql);
            // 给 ？ 传值
            //在JDBC中 所有的下标从1开始
            //以下代码含义是：给第一个占位符赋值
            ps.setString(1, loginName);
            ps.setString(2, loginPwd);
            //执行sql语句
            rs = ps.executeQuery();
            //处理结果集，结果集中有数据则登录成功，没数据就失败
            if (rs.next()) {
                loginSuccess = true;
                realName = rs.getString("realname");
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            // 释放资源
            DbUtils.close(conn, ps, rs);
        }

        System.out.println(loginSuccess ? "登录成功！欢迎" + realName + "！" : "登录失败！您的用户不存在或者密码错误");
    }
}
